import numpy as np
import pandas as pd
import math
from math import *
import datetime
import skfuzzy as fuzz
#转换成弧度
def rad(d):
    return d*math.pi/180
#经纬度计算距离
def getdistance(lng1,lat1,lng2,lat2):
    radLat1=rad(lat1)
    radLat2=rad(lat2)
    a=rad(lat1)-rad(lat2)
    b=rad(lng1)-rad(lng2)
    s=2*math.asin(math.sqrt(math.pow(sin(a/2),2)+cos(radLat1)*cos(radLat2)*math.pow(sin(b/2),2)))
    s=s*6378.137#地球半径
    return s
#增加i个10分钟
def time_add(time,n):
    """
    time:时间
    n:n个10分钟
    """
    #datetime.timedelta主要用于做时间的加减
    time_add_10=datetime.datetime.strptime(time,'%Y-%m-%d %H:%M:%S')+datetime.timedelta(minutes=10*n)
    str_time=datetime.datetime.strptime(time_add_10,'%Y-%m-%d %H:%M:%S')#将时间转换成字符串
    return str_time
#10分钟内的航迹数据
#此处的session_data是某一批号，提取某一批号的10分钟内的数据
def time_add_data(initial_time,session_data,n):
    """
    time:时间
    n:n个10分钟
    """
    begin_time=time_add(initial_time,n)
    end_time=time_add(initial_time,n+1)
    subsection_data=session_data[(session_data['time']>=begin_time)
                                & (session_data['time']<=end_time)]
    subsection_data.reset_index(inplace=True)
    return subsection_data
def relation_data(data,session_len_data,r_m,r_n):
    """
    data:雷达航迹数据
    session_len_data:每个雷达的航迹总数和批号
    r_m:雷达的各个航迹批号信息
    r_n:雷达的各个航迹批号信息（ais船的mmsi信息）
    """
    m,n=data.shape
    finally_list=[]
    fal=True
    while fal:
        max_index=np.argwhere(data==data.max())[0]
        relation_session=[session_len_data[r_m-1][1:][max_index[0]],session_len_data[r_n-1][1:][max_index[1]]]
        #去重
        if relation_session not in finally_list:
            finally_list.append(relation_session)

        for i in range(n):
            data[max_index[0]][i]=0
        for i in range(m):
            data[i][max_index[1]]=0
        if (data==np.zeros((m,n))).all():
            fal=False
    return finally_list
#吧同一个批号的数据的每10分钟统计一下走的距离，以及各个特征列的均值数据
def format_data(df_data,initial_time,n):
    """
    df_data:雷达航迹数据
    initial_time:初使时间，从这个时间开始分析数据
    n:分段进行数据合并
    """
    df_data.dropna(inplace=True)#缺失值处理
    df_data.drop_duplicate(inplace=True)#重复值处理
    df_data.sort_values('time',inplace=True)#按时间先后顺序排序
    df=df_data.groupby('system_snc_session')#按批号分组/按mmsi分组

    df_session_data=[]
    for data in df:
        session_data=data[1]#雷达的某个批号各个航迹数据，data[0]记录了航迹批号
        one_session_data=[]#一条航迹的所有数据
        one_session_data.append(data[0])#添加航迹批号
        for i in range(n):#每个时间段的航迹数据
            subsection_data=time_add_data(initial_time,session_data,i)#吧每个批号分段，10分钟一段
            if len(subsection_data)!=0:
                distance=[]
                for j in range(len(subsection_data)):
                    #if j==len(subsection_data)-1:
                        #break
                    #else:
                    lng1=subsection_data.loc[j]['lng']
                    lat1=subsection_data.loc[j]['lat']
                    lng2=subsection_data.loc[j+1]['lng']
                    lat2=subsection_data.loc[j+1]['lat']
                    d=getdistance(lng1,lat1,lng2,lat2)#一条船所走的路程
                    distance.append(d)#吧一个10分钟内同一批号的船先后距离都追加进去

                one_session_data.append(subsection_data['lat'].mean())#某一批号数据的经纬度均值
                one_session_data.append(subsection_data['lng'].mean())
                one_session_data.append(subsection_data['speed'].mean())#某一批号数据的速度和航向均值
                one_session_data.append(sum(distance))#取船所走过的距离
            else:
                one_session_data.append(0)
                one_session_data.append(0)
                one_session_data.append(0)
                one_session_data.append(0)
                one_session_data.append(0)
            df_session_data.append(one_session_data)#一个批号的数据的特性记载：平均经纬度、速度、距离
        format_df=pd.DataFrame(df_session_data)
        format_df=format_df.replace(np.nan,0)# 把dataframe中的nan替换为0

        return format_df
#航迹对做进一步距离判断，在允许误差范围内，判定航迹对为相关联
def analysis(concate_data,relation_data,k):
    """
    concate_data:航迹的初始数据(未经过标准化处理）
    relation_data:相关航迹对数据
    k:两条航迹之间允许的距离误差
    """
    final_relation_data=[]
    m,n=concate_data.shape
    for data in relation_data:
        distance=[]
        intial_data=concate_data[(concate_data[0]==data[0])|(concate_data[0]==data[1])]
        for i in range(n):
            if i % 5==0 and i !=(n-1):
                coordinate_data=intial_data.loc[:,(i+1):(i+2)]
                lats=coordinate_data[(i+1)].to_list()
                lngs=coordinate_data[(i+2)].to_list()

                #计算航迹对每段时间坐标之间的距离
                d=getdistance(lngs[0],lats[0],lngs[1],lats[1])
                if d!=0:
                    distance.append(0)
        if min(distance)<=k:
            final_relation_data.append(data)
    return final_relation_data
















